package main

import (
	"fmt"
	"sync/atomic"
)

func main() {
	var box atomic.Value
	v := []int{1,2,3}  // 切片是引用类型
	box.Store(v)
	v[1] = 4  // 此处的操作不是并发安全的！
	fmt.Println(box.Load())  // 存储的值被改变了

	// 正确的做法如下：
	// 下面这个函数就是把引用类型复制一份出来，然后存储起来
	// 类似于把一个值类型传递给函数的效果
	store := func(v []int) {
		replica := make([]int, len(v))
		copy(replica, v)
		box.Store(replica)
	}
	store(v)
	v[2] = 5  // 再试着改变切面的值
	fmt.Println(box.Load())  // 存储的是副本的值，不会被上面的改变影响
}